package org.xx.armory.db;

import org.xx.armory.commons.LifeCycle;

import javax.sql.DataSource;

/**
 * 创建会话的工厂
 *
 * @author Dev
 */
public interface SessionFactory
        extends LifeCycle {
    /**
     * 获取会话工厂关联的数据源。
     *
     * @return 会话工厂关联的数据源。
     */
    DataSource getDataSource();

    /**
     * 设置会话工厂关联的数据源。
     *
     * @param dataSource
     *         会话工厂关联的数据源。
     * @throws NullPointerException
     *         如果参数{@code dataSource}是{@code null}。
     */
    void setDataSource(DataSource dataSource);

    /**
     * 获取关联的事务管理器。
     *
     * @return 关联的事务管理器。
     */
    TransactionManager getTransactionManager();

    /**
     * 设置关联的事务管理器。
     *
     * @param transactionManager
     *         关联的事务管理器。
     * @throws IllegalArgumentException
     *         如果参数{@code transactionManager}是{@code null}。
     */
    void setTransactionManager(TransactionManager transactionManager);

    /**
     * 创建一个新的会话对象。
     *
     * @return 新的会话对象。
     */
    Session newSession();

    /**
     * 复制一个新的会话工厂
     *
     * @return 新的会话工厂, 和当前的工厂共用相同的数据源。
     */
    SessionFactory fork();
}
